package com.pshare.tool;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import com.pshare.tool.UpYun.PARAMS;
import com.pshare.util.SysPropertyUtils;

/**
 * 图片类空间上传工具
 * <p>
 * 注意：直接使用部分图片处理功能后，将会丢弃原图保存处理后的图片
 */
public class UpYunPicTool {

	private static final Logger logger = Logger.getLogger(UpYunPicTool.class);

	// 运行前先设置好以下三个参数
	private static final String BUCKET_NAME = SysPropertyUtils.getProperty("upyun.pic.bucket");
	private static final String OPERATOR_NAME = SysPropertyUtils.getProperty("upyun.user");
	private static final String OPERATOR_PWD = SysPropertyUtils.getProperty("upyun.password");

	/** 绑定的域名 */
	private static final String URL = "http://" + BUCKET_NAME + ".b0.upaiyun.com";

	/** 根目录 */
	private static final String DIR = "/";

	private static UpYun upyun = null;

	static {
		// 初始化空间
		upyun = new UpYun(BUCKET_NAME, OPERATOR_NAME, OPERATOR_PWD);
		// ****** 可选设置 begin ******

		// 切换 API 接口的域名接入点，默认为自动识别接入点
		// upyun.setApiDomain(UpYun.ED_AUTO);

		// 设置连接超时时间，默认为30秒
		// upyun.setTimeout(60);

		// 设置是否开启debug模式，默认不开启
		// upyun.setDebug(true);

		// ****** 可选设置 end ******
	}

	/**
	 * 上传文件
	 * 
	 * @throws IOException
	 */
	public static boolean uploadFile(InputStream is, String serverPath) throws IOException {
		// 设置待上传文件的 Content-MD5 值
		// 如果又拍云服务端收到的文件MD5值与用户设置的不一致，将回报 406 NotAcceptable 错误
//		upyun.setContentMD5(UpYun.md5(is));
		if (is.markSupported())
			is.reset();

		// 上传文件，并自动创建父级目录（最多10级）
		boolean result = upyun.writeFile(serverPath, is, true);
		logger.info(serverPath + " 上传" + isSuccess(result));

		// 图片宽度
		logger.info("图片宽度:" + upyun.getPicWidth());
		// 图片高度
		logger.info("图片高度:" + upyun.getPicHeight());
		// 图片帧数
		logger.info("图片帧数:" + upyun.getPicFrames());
		// 图片类型
		logger.info("图片类型:" + upyun.getPicType());
		
		return result;
	}
	
	public static boolean uploadFile(File file, String serverPath) throws IOException {
		// 设置待上传文件的 Content-MD5 值
		// 如果又拍云服务端收到的文件MD5值与用户设置的不一致，将回报 406 NotAcceptable 错误
		upyun.setContentMD5(UpYun.md5(file));

		// 上传文件，并自动创建父级目录（最多10级）
		boolean result = upyun.writeFile(serverPath, file, true);

		logger.info(serverPath + " 上传" + isSuccess(result));

		// 图片宽度
		logger.info("图片宽度:" + upyun.getPicWidth());
		// 图片高度
		logger.info("图片高度:" + upyun.getPicHeight());
		// 图片帧数
		logger.info("图片帧数:" + upyun.getPicFrames());
		// 图片类型
		logger.info("图片类型:" + upyun.getPicType());
		
		return result;
	}

	/**
	 * 图片做缩略图
	 * <p>
	 * 注意：若使用了缩略图功能，则会丢弃原图
	 * 
	 * @throws IOException
	 */
	public static boolean gmkerl(InputStream is, String filePath) throws IOException {
		if (is.markSupported())
			is.reset();

		// 设置缩略图的参数
		Map<String, String> params = new HashMap<String, String>();

		// 设置缩略图类型，必须搭配缩略图参数值（KEY_VALUE）使用，否则无效
		params.put(PARAMS.KEY_X_GMKERL_TYPE.getValue(),
				PARAMS.VALUE_FIX_BOTH.getValue());

		// 设置缩略图参数值，必须搭配缩略图类型（KEY_TYPE）使用，否则无效
		params.put(PARAMS.KEY_X_GMKERL_VALUE.getValue(), "500x500");

		// 设置缩略图的质量，默认 95
		params.put(PARAMS.KEY_X_GMKERL_QUALITY.getValue(), "95");

		// 设置缩略图的锐化，默认锐化（true）
		params.put(PARAMS.KEY_X_GMKERL_UNSHARP.getValue(), "true");

		// 若在 upyun 后台配置过缩略图版本号，则可以设置缩略图的版本名称
		// 注意：只有存在缩略图版本名称，才会按照配置参数制作缩略图，否则无效
		params.put(PARAMS.KEY_X_GMKERL_THUMBNAIL.getValue(), "small");

		// 上传文件，并自动创建父级目录（最多10级）
		boolean result = upyun.writeFile(filePath, is, true, params);

		logger.info(filePath + " 制作缩略图" + isSuccess(result));
		logger.info("可以通过该路径来访问图片：" + URL + filePath);
		
		return result;
	}

	/**
	 * 图片旋转
	 * 
	 * @throws IOException
	 */
	public static void rotate(InputStream is, String filePath) throws IOException {

		// 图片旋转功能具体可参考：http://wiki.upyun.com/index.php?title=图片旋转
		Map<String, String> params = new HashMap<String, String>();

		// 设置图片旋转：只接受"auto"，"90"，"180"，"270"四种参数
		params.put(PARAMS.KEY_X_GMKERL_ROTATE.getValue(),
				PARAMS.VALUE_ROTATE_90.getValue());

		// 上传文件，并自动创建父级目录（最多10级）
		boolean result = upyun.writeFile(filePath, is, true, params);

		logger.info(filePath + " 图片旋转" + isSuccess(result));
		logger.info("可以通过该路径来访问图片：" + URL + filePath);
		
	}

	/**
	 * 图片裁剪
	 * 
	 * @throws IOException
	 */
	public static void crop(InputStream is, String filePath) throws IOException {

		// 图片裁剪功能具体可参考：http://wiki.upyun.com/index.php?title=图片裁剪
		Map<String, String> params = new HashMap<String, String>();

		// 设置图片裁剪，参数格式：x,y,width,height
		params.put(PARAMS.KEY_X_GMKERL_CROP.getValue(), "50,50,300,300");

		// 上传文件，并自动创建父级目录（最多10级）
		boolean result = upyun.writeFile(filePath, is, true, params);

		logger.info(filePath + " 图片裁剪" + isSuccess(result));
		logger.info("可以通过该路径来访问图片：" + URL + filePath);
		
	}

	private static String isSuccess(boolean result) {
		return result ? " 成功" : " 失败";
	}
	
	public static boolean deleteFile(String filePath) {
		if (StringUtils.isBlank(filePath)) {
			return false;
		}
		return upyun.deleteFile(filePath);
	}
}
